﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;

namespace 社畜
{
	public partial class SplashScreenWindow : Form
	{
		//=========================================================================================
		/// <summary>コンストラクタ</summary>
		//=========================================================================================
		public SplashScreenWindow()
		{
			InitializeComponent();
		}

		//=========================================================================================
		/// <summary>親ウィンドウ上に表示</summary>
		//=========================================================================================
		public void Show( Form owner )
		{
#if Chrome
			this.LoadChromeImage();
#else
			this.LoadRandomImage();
#endif

			this.StartPosition = FormStartPosition.Manual;
			this.Left = owner.Left + ( owner.Width - this.Width ) / 2;
			this.Top = owner.Top + ( owner.Height - this.Height ) / 2;

			// 常に親ウィンドウの手前に表示
			this.Owner = owner;

			// モードレス・ダイアログとして表示
			this.Show();
		}

		//=========================================================================================
		/// <summary>カレントフォルダの画像をランダムに表示</summary>
		//=========================================================================================
		private void LoadRandomImage()
		{
			// Imageクラスで使用可能な形式のファイルを列挙
			Regex regEx = new Regex( @".bmp|.gif|.jpg|.png|.tiff" );
			IEnumerable<String> files = from file in Directory.GetFiles( @".\" ) where regEx.IsMatch( file ) select file;

			// 見つかった場合は画像を表示
			if( 0 < files.Count() )
			{
				int i = files.Count();

				// 複数ファイルが有る場合はランダムで使用する
				Random rand = new Random();
				int fileIndex = rand.Next( files.Count() );

				Image progressImage = Image.FromFile( files.ElementAt( fileIndex ) );
				this.BackgroundImage = progressImage;

				// 画像サイズに画面サイズを合わせる
				this.Width = progressImage.Width;
				this.Height = progressImage.Height;
			}
		}

		//=========================================================================================
		/// <summary>Chromeのキャッシュフォルダ内の画像を表示</summary>
		//=========================================================================================
		private void LoadChromeImage()
		{
			// GoogleChromeキャッシュ読み込みモード
			String cachePath = Environment.GetFolderPath( Environment.SpecialFolder.LocalApplicationData );
			if( cachePath.EndsWith( "\\" ) == false )
			{
				cachePath += "\\";
			}

			// キャッシュフォルダまでのパスを作成
			cachePath += @"Google\Chrome\User Data\Default\Cache\";

			// キャッシュフォルダ内のファイルを全取得
			String[] files = Directory.GetFiles( cachePath );

			// キャッシュフォルダ内ファイルをランダムに並び替え
			String[] randomFiles = files.OrderBy( i => Guid.NewGuid() ).ToArray();

			foreach( String filePath in randomFiles )
			{
				try
				{
					// 画像読み込み
					Image progressImage = Image.FromFile( filePath );

					// FromFileメソッドで例外が発生しない場合は画像ファイル読み込み成功
					this.BackgroundImage = progressImage;

					// 画像サイズに画面サイズを合わせる
					this.Width = progressImage.Width;
					this.Height = progressImage.Height;
					break;
				}
				catch( Exception e )
				{
					Console.WriteLine( e.Message );
				}
			}
		}

		//=========================================================================================
		/// <summary>画像サイズを元にウィンドウサイズを変更</summary>
		//=========================================================================================
		private void ResizeWindow( Image loadImage )
		{
			double width = 540.0;
			double height = 400.0;
			double mainWindowRate = width / height;

			if( this.Owner != null )
			{
				width = this.Owner.Width;
				height = this.Owner.Height;
			}

			// メイン画面より画像サイズが大きい
			if( width < loadImage.Width && height < loadImage.Height )
			{
				// 画像サイズに画面サイズを合わせる
				this.Width = loadImage.Width;
				this.Height = loadImage.Height;
				return;
			}

			// 縦横の比率
			double xyRate = loadImage.Width / loadImage.Height;

			// 高さより幅のほうが大きい
			if( loadImage.Height < loadImage.Width && mainWindowRate < xyRate )
			{
				double heightRate = height / loadImage.Height;
				this.Width = Convert.ToInt32( width * heightRate );
				this.Height = Convert.ToInt32( height );
			}
			else
			{
				double widthRate = width / loadImage.Width;
				this.Width = Convert.ToInt32( width );
				this.Height = Convert.ToInt32( height * widthRate );
			}

		}
	}
}
